package com.qf.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author Ypl
 * @version V1.0
 * @Project September-mavens
 * @Package com.qf.aop
 * @Description:
 * @Date 2022/9/28 22:20
 */
@SuppressWarnings("all")
@Component
@Aspect
public class Aop {
    //切入点表达式
    @Pointcut("execution(* com.qf.serviceimpl.AccountServiceImpl.*(..))")
    public void pc(){}


    /**
     * 环绕: 在环绕中必须调用原始方法，所以必须使用连接点对象
     *
     */
    @Around("pc()")
    public Object  around(ProceedingJoinPoint joinPoint) throws Exception{
        try {
            System.out.println("前置增强");
            //调用原始方法
            Object result = joinPoint.proceed();
            System.out.println("后置增强");
            return result;
        }catch (Throwable throwable) {
            System.out.println("异常增强");
            throwable.printStackTrace();
            throw new Exception();

        } finally {
            System.out.println("最终增强");
        }
    }

    /**
     * 前置增强
     * @param joinPoint
     */
//    @Before("pc()")
//    public void before(JoinPoint joinPoint){
//        System.out.println("前置增强");
//
//        System.out.println("时间：[" + new Date()+"] 调用了 ["+ joinPoint.getTarget().getClass()
//                +"] 方法：["+joinPoint.getSignature().getName()+"]，参数列表为：["
//                + Arrays.toString(joinPoint.getArgs())+"]");
//
////        如果要获取日志，就使用连接点对象 JoinPoint
//    }

    /**
     * 后置
     */
//    @AfterReturning("pc()")
//    public void after(){
//        System.out.println("后置增强");
//    }
    /**
     * 异常
     */
//    @AfterThrowing(value = "pc()",throwing = "e")
//    public void throwing(Exception e){
//        // e.getMessage()获取异常信息
//        System.out.println("异常增强");
//    }
}
